﻿namespace los14
{
    #region     知识回顾   构造函数（去看之前讲的）
    #endregion

    #region     知识点一   基本概念
    //特点
    //当申明一个子类对象时
    //先执行父类的构造函数
    //再执行子类的构造函数

    //注意
    //1.父类的无参构造  很重要
    //2.子类可以通过base关键字 代表父类 调用父类构造
    #endregion

    #region     知识点二   执行顺序 
    //父类的父类的构造 → ......父类构造 → 子类构造
    class GameObject 
    {
        public GameObject()
        {
            Console.WriteLine("GameObject里的构造函数");
        }
    }
    class Player:GameObject
    {
        public Player()
        {
            Console.WriteLine("Player的构造函数");
        }
    }
    class MainPlayer:Player
    {
        public MainPlayer()
        {
            Console.WriteLine("MainPlayer里的构造函数");
        }
    }
    #endregion

    #region     知识点三   父类的无参构造函数的重要性
    //子类实例化时 默认自动调用的 是父类的无参构造被顶掉 会报错
    class Father
    {
        public Father(int i)    //int i被顶掉报错了
        {
            Console.WriteLine("Father构造函数");
        }
        //public Father()
        //{
            
        //}
    }
    class Son:Father
    {
        #region     知识点四   通过base调用指定父类构造
        public Son(int i):base(i)
        {
            Console.WriteLine(i);
        }
        public Son(int i,string str):this(i)
        {
            Console.WriteLine(i+str);
        }
        #endregion
    }
    #endregion
    internal class class14
    {
        static void Main(string[] args)
        {
            Console.WriteLine("继承中的构造函数");
            MainPlayer p = new MainPlayer();//打印结果有三条

            Son s = new Son(3, "Charlie");
        }
        //总结：
        //继承中的构造函数
        //特点
        //执行顺序 是先执行父类的构造函数  在执行子类的
        
        //父类中的无参构造函数很重要
        //如果被顶掉 子类中就无法默认调用无参构造了
        //解决方法：
        //1.始终保持申明一个无参构造
        //2.通过base关键字 调用指定父类构造
        //注意：
        //区分this和base的区别

    }
}
